# 岭回归
'''
岭回归是一种线性回归模型，它的预测公式与普通最小二乘法相同，但增加了一个约束条件：
希望系数（w）尽量小，即让每个特征对输出的影响尽可能小，同时保持预测结果的准确性。
这种约束被称为L2正则化，是正则化的一种形式，用于防止模型过拟合。
简而言之，岭回归通过限制系数的大小来平衡模型的拟合度和复杂度。
'''
import mglearn
# 岭回归在 linear_model.Ridge 中实现。来看一下它对扩展的波士顿房价数据集的效果如何
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
ridge = Ridge().fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge.score(X_test, y_test)))

# Training set score: 0.89
# Test set score: 0.75

'''
Ridge模型在训练集上的得分低于线性回归，但在测试集上的得分更高，这符合我们的预期。
线性回归容易过拟合，而Ridge模型由于其更强的约束，减少了过拟合的风险。
虽然Ridge模型在训练集上的表现可能不如线性回归，但它在新数据上的泛化能力更强。
因此，如果我们关心模型在未知数据上的表现，应该选择Ridge模型而不是线性回归模型。
'''

# alpha
'''
 Ridge模型通过alpha参数平衡模型的简单性（系数接近0）和训练集上的表现。
 用户可以根据具体数据集调整alpha值，以达到最佳平衡。
 增大alpha会使系数更小，可能降低训练集性能，但有助于提高模型在新数据上的泛化能力。
'''

ridge10 = Ridge(alpha=10).fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge10.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge10.score(X_test, y_test)))
# Training set score: 0.79
# Test set score: 0.64

'''
 减小 alpha 可以让系数受到的限制更小,对于非常小的 alpha 值，
 系数几乎没有受到限制，我们得到一个与 LinearRegression 类似的模型
'''

ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge01.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge01.score(X_test, y_test)))

# Training set score: 0.93
# Test set score: 0.77



'''
通过观察不同alpha值下Ridge模型的coef_属性，我们可以更直观地理解alpha参数对模型的影响。
较大的alpha意味着更强的正则化，导致系数更小。
在所有数据集大小的情况下，岭回归的训练分数普遍低于线性回归，因为它引入了正则化。
然而，岭回归在测试集上的表现更好，尤其是在数据量较小时。
当数据量少于400个时，线性回归可能无法学习到有效信息。
随着数据量的增加，两种模型的性能都会提高，最终线性回归的性能可能会赶上岭回归。
这表明，当训练数据充足时，正则化的作用减弱，岭回归和线性回归的性能趋于一致。
此外，随着数据量的增加，线性回归的训练性能可能会下降，这表明模型越来越难以过拟合或记忆所有数据。
'''
